import datetime
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.db.models import F
from apps.orders.models import Order
from apps.schedules.models import TimeSlot

class Command(BaseCommand):
    help = '清理无用订单（无厨师订单、过期未支付、过期取消/退款、空订单）并恢复关联的可用档期'

    def add_arguments(self, parser):
        parser.add_argument(
            '--dry-run',
            action='store_true',
            help='仅展示待清理订单数量和待恢复档期，不实际执行操作'
        )
        parser.add_argument(
            '--pending-days',
            type=int,
            default=30,
            help='待支付订单过期天数（默认30天）'
        )
        parser.add_argument(
            '--expired-days',
            type=int,
            default=90,
            help='已取消/退款订单过期天数（默认90天）'
        )

    def handle(self, *args, **options):
        dry_run = options['dry_run']
        pending_days = options['pending_days']
        expired_days = options['expired_days']

        # 计算时间阈值
        pending_cutoff = timezone.now() - datetime.timedelta(days=pending_days)

        # 1. 无对应厨师订单的订单
        no_chef_order = Order.objects.filter(chef_order__isnull=True)
        
        # 2. 长期未支付的订单（叠加无厨师订单条件，避免误删已关联厨师的订单）
        old_pending = Order.objects.filter(
            status='pending',
            created_at__lt=pending_cutoff,
            chef_order__isnull=True
        )
        
        # 3. 无订单项的空订单
        empty_orders = Order.objects.filter(items__isnull=True)

        # 合并所有待清理订单（去重）
        to_clean = (no_chef_order | old_pending | empty_orders).distinct()

        # 展示订单统计
        self.stdout.write(f"待清理订单总数：{to_clean.count()}")
        self.stdout.write(f"  - 无对应厨师订单：{no_chef_order.count()}")
        self.stdout.write(f"  - 超{pending_days}天未支付：{old_pending.count()}")
        self.stdout.write(f"  - 无订单项的空订单：{empty_orders.count()}")

        # 执行删除（非dry-run模式）
        if not dry_run:
            confirm = input("确认删除以上订单并恢复关联可用档期？(y/N) ")
            if confirm.lower() == 'y':
                # 1. 先获取待清理订单关联的TimeSlot ID（避免删除后无法查询）
                order_ids = to_clean.values_list('id', flat=True)
                affected_time_slots = TimeSlot.objects.filter(order_id__in=order_ids)
                slot_count = affected_time_slots.count()

                # 2. 删除订单
                deleted_count, _ = to_clean.delete()
                self.stdout.write(self.style.SUCCESS(f"成功删除 {deleted_count} 个无用订单"))

                # 3. 恢复无订单关联的档期状态为available
                if slot_count > 0:
                    updated_slots = TimeSlot.objects.filter(
                        order_id__isnull=True  # 订单ID为空（已删除或未关联）
                    ).exclude(
                        status='available'  # 排除状态为available的记录（只更新非available状态）
                    ).update(status='available')
                    self.stdout.write(self.style.SUCCESS(f"成功将 {updated_slots} 个档期恢复为可用状态"))
            else:
                self.stdout.write("已取消操作")
        else:
            # dry-run模式：展示待恢复的档期数量
            order_ids = to_clean.values_list('id', flat=True)
            affected_time_slots = TimeSlot.objects.filter(
                order_id__in=order_ids
            ).exclude(
                status='available'
            )
            self.stdout.write(f"待恢复为可用状态的档期数量：{affected_time_slots.count()}")
            self.stdout.write(self.style.WARNING("dry-run模式：未执行删除和档期恢复操作"))
